/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logic;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import persistence.Account;

/**
 * On a pris le parti d'exposer le session bean au travers d'une interface métier locale
 * 
 */
@Stateless
public class CustomerManagerBean implements CustomerManagerLocal {

    @PersistenceContext
    EntityManager em;

    /**
     * NonUniqueResultException est une exception non contrôlée déclenchée si pas de résultat retournée
     *
     */
    @Override
    public boolean memberExists(String login, String pwd) {

       try{
       String queryString =" SELECT a from Account a WHERE a.authenticationInfo.login=:login AND "+
               "a.authenticationInfo.pwd=:pwd";
       Query query = em.createQuery(queryString); //ici pas besoin de requête typée car on ne va pas manipuler le résultat retourné
       query.setParameter("login", login);
       query.setParameter("pwd", pwd);
       query.getSingleResult();
        return true;
        }catch(NoResultException nue){
        //Remarque : cette exception de type système (hors contrôle) n'entraîne pas le rollback de la tsx. C'est un cas particulier.
        //Si elle est levée et esquivée (non gérée). Si aussi le cas de NonUniqueResutException
        //on doit donc gérer ce type d'exception pour éviter une inconsistance des données car la tsx active englobante n'est pas
        //annulée en cas de levée de ces exceptions -- On aurait pu/dû ajouter un  un gestionnaire pour NonUniqueResultException

            //on gère l'exception
            return false;
        }
    }
    /**
     *
     * @return liste de comptes - des problèmes de performances (empreinte mémoire) pourraient survenir
     * dans le cas ou la liste contiendrait un nombre trés important de compte.
     * il faudrait retourner une liste d'objets ne contenant que les données à afficher. le pattern DTO pourrait
     * être une solution bien qu'il soit considéré comme un anti-pattern en java EE
     * Une autre solution serait de paginer les résultat de la requête JPQL (ce n'est pas au programme)
     *
     */
    @Override
    public List<Account> retrieveAllAccounts() {
        TypedQuery<Account> query = em.createNamedQuery("loadAllAccounts",Account.class);
        List<Account> accs = query.getResultList();
        return accs;
    }

    @Override
    public Account retrieveMemberByLogin(String login) {
        try{
       String queryString =" SELECT a from Account a WHERE a.authenticationInfo.login=:login";
       TypedQuery<Account> query = em.createQuery(queryString,Account.class);
       query.setParameter("login", login);
      
       Account member = query.getSingleResult();
        return member;
        }catch(NoResultException nue){
         //on gère l'exception
            return null;
        }
    }


    
   
 
}
